/**
 *  TextMash - simple IDE for Clojure
 *  
 *  Copyright (C) 2010 Aleksander Naszko
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *  
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package pl.olek.textmash.workspace;

import javax.swing.text.AbstractDocument;
import javax.swing.text.BoxView;
import javax.swing.text.ComponentView;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.IconView;
import javax.swing.text.LabelView;
import javax.swing.text.ParagraphView;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledEditorKit;
import javax.swing.text.View;
import javax.swing.text.ViewFactory;

/**
 * 
 * @author anaszko
 *
 */
public class NoWrapEditorKit extends StyledEditorKit {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 4770736543774589984L;
	TextEditor pane;
	
	public NoWrapEditorKit(TextEditor pane) {
		this.pane = pane;
	}
	
	public ViewFactory getViewFactory() {
		return new StyledViewFactory();
	}

	@Override
	public Document createDefaultDocument() {
		return new ConcurrentDocument(pane);
	}

	static class StyledViewFactory implements ViewFactory {
		public View create(Element elem) {
			String kind = elem.getName();

			if (kind != null) {
				if (kind.equals(AbstractDocument.ContentElementName)) {
					return new LabelView(elem);
				} else if (kind.equals(AbstractDocument.ParagraphElementName)) {
					return new ParagraphView(elem);
				} else if (kind.equals(AbstractDocument.SectionElementName)) {
					return new NoWrapBoxView(elem, View.Y_AXIS);
				} else if (kind.equals(StyleConstants.ComponentElementName)) {
					return new ComponentView(elem);
				} else if (kind.equals(StyleConstants.IconElementName)) {
					return new IconView(elem);
				}
			}

			return new LabelView(elem);
		}
	}

	static class NoWrapBoxView extends BoxView {
		public NoWrapBoxView(Element elem, int axis) {
			super(elem, axis);
		}

		public void layout(int width, int height) {
			super.layout(32768, height);
		}

		public float getMinimumSpan(int axis) {
			return super.getPreferredSpan(axis);
		}
	}

}
